/* Driver para comparador en target EZ430_RF2500T
Como el comparador no es capaz de interrumpir, la salida del comparador
debe cablearse a un pin de I/O que se configura para generar interrupciones
con los flancos.

Cableado necesario entre pines del conector de la placa:
* Self metering:
 * pin 7 (Vref) a pin 3 (entrada del comparador)
 * pin 8 (comp out) a pin 4 (entrada I/O que detecta flanco)
* External metering:
 * pin 3 (entrada del comparador) a Voltaje propocionado por los capacitores
 * pin 8 (comp out) a pin 4 (entrada I/O que detecta flanco)
 
*/

#include "comparator_EZ430_RF2500T.h"
#include "msp430f2274.h"
#include "intrinsics.h"


//--- Constantes y variables
static void (* comp_registered_callback_fn)(void) ;

//--- prototipo de funciones internas
void comparator_isr (void);


//-------------------------------------
// Comparator initialization
//-------------------------------------
void comparator_init(void (*callback_fn)() ){
  // register callback function
  comp_registered_callback_fn = callback_fn;

  //-- Configuracion de comparator.
  // OA0CTL0 Comparator 0 control register
  OA0CTL0 |= OAADC0;   // OAADC0=01: OA0OUT connected to pin 8
  OA0CTL0 |= (OAPM0 + OAPM1); // Enable output with fast slew rate
  // OA0CTL1 Comparator 1 control register
  OA0CTL1 |= (OAFBR1 + OAFBR0);  // OAFBRx=011: 10R/6R = 0.6 with OARRIP=0
  OA0CTL1 |= (OAFC1 + OAFC0); //OAFCx=011 modo comparator

  // --- Vref setup
  // ADC10CTL0 ADC control register 0 
  ADC10CTL0 |= REFOUT;   // VREF externally on pin VREF+.
  ADC10CTL0 &= ~REF2_5V; // Vref = 1.5V
  ADC10CTL0 |= REFON;    // Internar Ref ON 

  //--- Pin configuration
  P2SEL |= 0x0010;  // P2.4 used by periferic (Vref out)
  P2SEL |= 0x0001;  // P2.0 used by periferic (comp in)
  P4SEL |= 0x0008;  // P4.3 used by periferic (comp out)

  //--- I/O interrupt
  P2DIR &= ~0x0002;  // P2.1 input
#ifdef EXTERNAL_METERING
  P2IES |= 0x0002; // interrupt when HIGH to LOW // 
#else 
  P2IES &= ~0x0002; // interrupt when LOW to HIGH // 
#endif  

  P2IE  |= 0x0002;  // Interrupt enable
    return; 
} 



// Rutina de atención a la interrupción generada por flanco

// Para aplicación demo del kit las directivas:
//      #pragma vector=PORT2_VECTOR   
//      __interrupt ......
// ya estan definidas en 
//.\Components\bsp\boards\EZ430RF\bsp_external\mrfi_board.c
// deben comentarse y dejar solo:
//    void comparator_isr (void){

#pragma vector=PORT2_VECTOR   
__interrupt void comparator_isr (void){
    comp_registered_callback_fn();  // Execute registered callback function;
    P2IFG &= ~0x0002;              // limpio flag de interrupciones
    }
